﻿/*
command Name parameters Description 
m moveto 2 Start a new sub-path at the given (x,y) coordinate 
l lineto 2* Draw a line from the current point to the given (x,y) coordinate which becomes the new current point. A number of coordinate pairs may be specified to form a polyline. 
c curveto 6* Draw a cubic bézier curve from the current point to the coordinate given by the final two parameters, the control points given by the first four parameters. The current point becomes the end point of the bézier. 
x close 0 Close the current sub-path by drawing a straight line from the current point to the original moveto point. 
e end 0 End the current set of sub-paths. A given set of sub-paths (as delimited by end) is filled using eofill. Subsequent sets of sub-paths are filled independently and superimposed on existing ones. 
t rmoveto 2* Start a new sub-path at the coordinate (cpx+x, cpy+y). 
r rlineto 2* Draw a line from the current point to the given relative coordinate (cpx+x, cpy+y). 
v rcurveto 6* Cubic bézier curve using the given coordinate relative to the current point. 
nf nofill 0 The current set of sub-paths (delimited by end - e) will not be filled. 
ns nostroke 0 The current set of sub-paths (delimited by end - e) will not be filled. 
ae angleellipseto 6* center (x,y) size(w,h) start-angle, end-angle. Draw a segment of an ellipse as describes using these parameters. A straight line is drawn from the current point to the start point of the segment. 
al angleellipse 6* Same as angleellipseto except that there is an implied moveto the starting point of the segment. 
at arcto 8* left, top, right, bottom start(x,y) end(x,y). The first four values define the bounding box of an ellipse. The last four define two radial vectors. A segment of the ellipse is drawn which starts at the angle defined by the start radius vector and ends at the angle defined by the end vector. A straight line is drawn from the current point to the start of the arc. The arc is always drawn in a counterclockwise direction. 
ar arc 8* left, top, right, bottom start(x,y) end(x,y). Same as arcto however a new sub-path is started by an implied moveto the start point of the arc. 
wa clockwisearcto 8* left, top, right, bottom start(x,y) end(x,y). Same as arcto but the arc is drawn in a clockwise direction. 
wr clockwisearc 8* left, top, right, bottom start(x,y) end(x,y). Same as arc but the arc is drawn in a clockwise direction 
qx ellipticalqaudrantx 2* end(x,y). 
A quarter ellipse is drawn from the current point to the given end point. The elliptical segment is initially tangential to a line parallel to the x-axis. (i.e. the segment starts out horizontal)
 
qy ellipticalquadranty 2* end(x,y). 
Same as ellipticalquadrantx except that the elliptical segment is initially tangential to a line parallel to the y-axis. (i.e. the segment starts out vertical)
 
qb quadraticbezier 2+2* (controlpoint(x,y))*, end(x,y) 
Defines one or more quadratic bézier curves by means of control points and an end point.  Intermediate (on-curve) points are obtained by interpolation between successive control points as in the OpenType font specification.  The sub-path need not be started in which case the sub-path will be closed.  In this case the last point of the sub-path defines the start point of the quadratic bézier.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;

namespace vmlModel.Entities
{
    public class vmlPathCommand 
    {
        public vmlPathShapeBase FatherPath { get; set; }
        public string cmdString { get; set; }
        public string cmdName { get; set; }
        public List<Point> cmdPoints { get; set; }
        public Point LastPoint { get { return (cmdPoints != null)? cmdPoints.Last(): new Point(0,0) ; } }
        public void AdjustPointsForDrawing(double DrawingXFactor , double DrawingYFactor)
        {
            if (cmdPoints == null || cmdPoints.Count == 0) return;
            List<Point> temp = new List<Point>();
            foreach (var pt in cmdPoints)
            {
               temp.Add(new Point(pt.X * DrawingXFactor , pt.Y * DrawingYFactor));
            }
            cmdPoints = temp ;
        }
        public vmlPathCommand(vmlPathShapeBase Father, Point rpt, string _cmdString)
        {
            cmdString = _cmdString;
            string[] cmdTokens = _cmdString.Replace("&&","&").Split('&');
            cmdName = cmdTokens[0];
            if (cmdTokens.Length < 2 || cmdTokens[1] == "") return;
            cmdPoints = new List<Point>();
            string[] pts = cmdTokens[1].Trim().Split(',');

            for (int i = 0; i < pts.Length; i+=2)
            {
                Point xy = new Point();
                xy.X = Father.FormulaCalculateString(pts[i]) ;//* vmlUtils.PixelPerInch;
                xy.Y = Father.FormulaCalculateString(pts[i + 1]); //* vmlUtils.PixelPerInch;
                switch (cmdName.ToLower())
                {
                    case "t":
                    case "r":
                    case "v":
                        xy.X += rpt.X;
                        xy.Y += rpt.Y;
                        break;
                    case "m":
                        break;
                    case "l":
                        break;
                    case "c":
                        break;
                    case "x":
                        break;
                    case "e":
                        break;
                    case "qx":
                        break;
                    case "qy":
                        break;
                    case "nf":
                        break;
                    case "ns":
                        break;
                    case "ae":
                        break;
                    case "al":
                        break;
                    case "at":
                        break;
                    case "ar":
                        break;
                    case "wa":
                        break;
                    case "wr":
                        break;
                    case "qb":
                        break;
                    default:
                        break;
                }
    
                cmdPoints.Add(xy);
            }

        }
    }
}
